package isd.seguridad.web;

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */



import isd.general.util.JsfUtil;
import isd.seguridad.modelo.SG_Menu;
import isd.seguridad.modelo.SG_Usuario;

import isd.seguridad.modelo.SG_UsuarioMenu;
import isd.seguridad.rn.SG_MenuRN;

import java.io.Serializable;
import java.util.List;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.servlet.http.HttpSession;
import org.primefaces.model.menu.DefaultMenuItem;
import org.primefaces.model.menu.DefaultMenuModel;
import org.primefaces.model.menu.DefaultSubMenu;
import org.primefaces.model.menu.MenuModel;

/**
 *
 * @author ctrosch
 */
@ManagedBean
@SessionScoped
public class NavegadorMB implements Serializable {

    private String paginaActiva = "/seguridad/login";
    private MenuModel modelo;
    @EJB private SG_MenuRN menuRN;

    public NavegadorMB() {

    }

    public MenuModel getModelo() {
        
        if (modelo == null)
            modelo = new DefaultMenuModel();
        return modelo;
    }

    public void setModelo(MenuModel modelo) {
        this.modelo = modelo;
    }
    
    public String getPaginaActiva() {
        return paginaActiva;
    }

    public void setPaginaActiva(String paginaActiva) {
        this.paginaActiva = paginaActiva;
    }

    public void handlerX(ActionEvent ae) {

   }

    public String navegar(ActionEvent ae){

        FacesContext facesContext = FacesContext.getCurrentInstance();
        ExternalContext externalContext = facesContext.getExternalContext();
        HttpSession session = (HttpSession) externalContext.getSession(true);

        if (session.isNew()){
            System.out.println("Session nueva");
            paginaActiva = "../seguridad/login.xhtml";
        }

        DefaultMenuItem  itm = (DefaultMenuItem) ae.getSource();
        SG_Menu menu = (SG_Menu) itm.getValue();
//        System.out.println("valor de item = " + itm.getValue());
        paginaActiva = menu.getAccion();

        
//        System.out.println("Pagina activa: " + paginaActiva);
        //return ".."+paginaActiva+".xhtml";
        paginaActiva = "../seguridad/login.xhtml";
        return paginaActiva;
    }

    public void cargarMenu(SG_Usuario u){

        if(u==null){
            JsfUtil.addWarningMessage("El usuario no existe");
            return;
        }

        //Traemos el menu actualizado
        u.setMenu(menuRN.getMenuByUsuario(u));

        if(u.getMenu()==null){
            JsfUtil.addWarningMessage("El usuario no tiene permisos asignados");
            return;
        }

        if(u.getMenu().isEmpty()){
            JsfUtil.addWarningMessage("El usuario no tiene permisos asignados");
            return;
        }

        modelo = new DefaultMenuModel();
        List<SG_Menu> menuPrincipal = menuRN.getListaByNivel(1,true);

        if(menuPrincipal ==null){
            JsfUtil.addWarningMessage("No es posible obtener el menu del sistema");
        }
        

        //Recorremos menu principal        
        for(SG_Menu mPrincipal: menuPrincipal){
            
            
            DefaultSubMenu submenu = new DefaultSubMenu(mPrincipal.getNombre());
            submenu.setId("menu" + mPrincipal.getId());

            SG_UsuarioMenu um = new SG_UsuarioMenu(u.getId(), mPrincipal.getId());

            if(u.getMenu().contains(um) && mPrincipal.getActivo()){

                //Generamos el arbol
                generarArbol(submenu, u, mPrincipal.getMenuItem());
                if(submenu.getElementsCount()!=0) modelo.addElement(submenu);

            }
        }
    }

    private void generarArbol(DefaultSubMenu  submenu, SG_Usuario u, List<SG_Menu> items){

        //Si el items está vacío no hace nada
        if (items.isEmpty()){
            return;
        }

        //Recorremos menu principal
        for(SG_Menu m: items){

            if(!m.getActivo()){
                continue;
            }

            SG_UsuarioMenu um = new SG_UsuarioMenu(u.getId(), m.getId());

            //Si no tiene hijos creamos el item
            if(m.getMenuItem().isEmpty()){
                
                if(u.getMenu().contains(um)){

//                    System.out.println("Usuario : " + u.getUsuario() + "- Item Menu: "+ m.getNombre());

                    DefaultMenuItem  item = new DefaultMenuItem(m.getNombre());
                    item.setId("Item" + m.getId());                    
                    item.setUrl(".."+m.getUrl()+".jsf");
                    item.setTarget("_blank");

                    switch (m.getTipo()){

                        //Registración
                        case 1:
                            item.setIcon("form16");
                            break;
                        //Informes
                        case 2:
                            item.setIcon("report24");
                            break;
                        //Configuracion
                        case 3:
                            item.setIcon("config16");
                            break;
                         //Impresiones
                        case 4:
                            item.setIcon("print16");
                            break;

                        default:
                            item.setIcon("disk00");
                            break;
                    }

//                    if(m.getNivel()==2) item.setIcon("disk00");
//                    if(m.getNivel()==3) item.setIcon("disk00");
//                    if(m.getNivel()==4) item.setIcon("disk01");
                    
                    submenu.getElements().add(item);
                }
                
            }else{

                if(u.getMenu().contains(um)){
                    
//                    System.out.println("Usuario : " + u.getUsuario() + "- Sub Menu: "+ m.getNombre());

                    //Si tiene hijos seguimos cargando el submenu
                    DefaultSubMenu  submenu1 = new DefaultSubMenu(m.getNombre());

                    submenu1.setId("Item" + m.getId());                                    
                    generarArbol(submenu1, u, m.getMenuItem());

                    submenu.getElements().add(submenu1);
                    //Si el menu no tiene item, entonces no lo agregamos

                    

                  }
            }            
        }
    }


    private void generarMenu(DefaultSubMenu  submenu, SG_Menu menuItem){

        if(menuItem.getMenuItem().isEmpty()){

            DefaultMenuItem item = new DefaultMenuItem(menuItem.getNombre());
            //item.setValue(".."+menuItem.getUrl()+".jsf");
            item.setUrl(".."+menuItem.getUrl()+".jsf");
            item.setTarget("_blank");

            if(menuItem.getNivel()==3) item.setIcon("disk00");
            if(menuItem.getNivel()==4) item.setIcon("disk01");
            /**
            FacesContext context = FacesContext.getCurrentInstance();
            MethodExpression actionListener = context.getApplication().getExpressionFactory().createMethodExpression(
                    context.getELContext(),
                    "#{navegadorMB.navegar}",
                    null,
                    new Class[] { ActionEvent.class });
            item.addActionListener(new MethodExpressionActionListener(actionListener));
             * */
            item.setId("Item" + menuItem.getId());

            submenu.getElements().add(item);
            //System.out.println("Se agrega Item: "+ menuItem.getNombre());
        }else{
            DefaultSubMenu submenu1 = new DefaultSubMenu(menuItem.getNombre());
            submenu1.setId("Item" + menuItem.getId());

            for(SG_Menu item: menuItem.getMenuItem()){

                if(item.getActivo()){
                    generarMenu(submenu1, item);
                }
            }


            //Si el menu no tiene item, entonces no lo agregamos
            if(submenu1.getElementsCount()!=0) submenu.getElements().add(submenu1);
        }
    }


    /**
    public void cargarMenu(Set<Menu> menuUsuario){

        modelo = new DefaultMenuModel();
        List<Menu> menuPrincipal = menuDAO.getListaByNivel(1,true);

//        System.out.println("Cantidad item menu principal encontrados: " + menuPrincipal.size());

        boolean encontroNivel1 = false;

        //Recorremos menu principal
        for(Menu menuPrinc: menuPrincipal){
            encontroNivel1 = false;
            Submenu submenu = new Submenu();
            //System.out.println("Menu principal: " + menuPrinc.getNombre());

            //Recorremos menu usuario

            for (Menu menuUsu: menuUsuario){
//                System.out.println("Menu principal usuario: " + menuUsu.getNombre() + " id " + menuUsu.getId());
//                System.out.println("Menu principal usuario: " + menuUsu.getMenuPrincipal() + " id " + menuUsu.getMenuPrincipal());
                if(menuUsu.getMenuPrincipal().equals(menuPrinc)){

                    //Agregamos menu nivel 1
                    if(!encontroNivel1){
                        submenu.setLabel(menuPrinc.getNombre());
                        submenu.setId("menu" + menuPrinc.getId());

                        //System.out.println("Se agrega menu nivel " + menuPrinc.getNivel() +" " + menuPrinc.getNombre());
                        encontroNivel1 = true;
                    }
                    generarMenu(submenu, menuUsu);

                }
            }
            //System.out.println("InformaciÃ³n menu: "+ submenu.getLabel()+ " items: " +submenu.getChildCount());

            //Si el menu no tiene item, entonces no lo agregamos
            if(submenu.getChildCount()!=0) modelo.addSubmenu(submenu);
        }
    }
     * **/

    /**
    private void generarMenu(Submenu submenu, Menu menuItem){

        if(menuItem.getMenuItem().isEmpty()){
            MenuItem item = new MenuItem();
            item.setValue(menuItem.getNombre());
            //item.setValue(".."+menuItem.getUrl()+".jsf");
            item.setUrl(".."+menuItem.getUrl()+".jsf");
            item.setTarget("_blank");

            if(menuItem.getNivel()==3) item.setIcon("disk00");
            if(menuItem.getNivel()==4) item.setIcon("disk01");



            FacesContext context = FacesContext.getCurrentInstance();
            MethodExpression actionListener = context.getApplication().getExpressionFactory().createMethodExpression(
                    context.getELContext(),
                    "#{navegadorMB.navegar}",
                    null,
                    new Class[] { ActionEvent.class });
            item.addActionListener(new MethodExpressionActionListener(actionListener));

            item.setId("Item" + menuItem.getId());

            submenu.getChildren().add(item);
            //System.out.println("Se agrega Item: "+ menuItem.getNombre());
        }else{
            Submenu submenu1 = new Submenu();
            submenu1.setLabel(menuItem.getNombre());
            submenu1.setId("Item" + menuItem.getId());

            for(Menu item: menuItem.getMenuItem()){
                generarMenu(submenu1, item);
            }
            submenu.getChildren().add(submenu1);
        }
    }
     * */

}

